var _discoveryStarted = false;
	
var _deviceId = null;
var _serviceId = null;
var _characteristicId = null;
var chs = [];
var btvalue = null;
	
function inArray(arr, key, val) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i][key] === val) {
      return i;
    }
  }
  return -1;
}
// ArrayBuffer转16进度字符串示例
function ab2hex(buffer) {
  var hexArr = Array.prototype.map.call(
    new Uint8Array(buffer),
    function (bit) {
      return ('00' + bit.toString(16)).slice(-2)
    }
  )
  return hexArr.join('');
}
	
//准备开始扫描
function $openBluetoothAdapter(devicename){
  //初始化蓝牙模块
  uni.openBluetoothAdapter({
    success: (res) => {
        console.log('openBluetoothAdapter success', res);
        $startBluetoothDevicesDiscovery(devicename);
    },
    fail: (res) => {
      uni.showToast({
          title: '请打开蓝牙',
          duration: 1000
      })
      if (res.errCode === 10001) {
        //监听蓝牙适配器状态变化事件
        uni.onBluetoothAdapterStateChange(function(res){
          console.log('onBluetoothAdapterStateChange', res);
          if (res.available) {
            //开始扫描
            $startBluetoothDevicesDiscovery(devicename)
          }
        })
      }
    }
  })
}
	
function $startBluetoothDevicesDiscovery(devicename){
  if (_discoveryStarted) {
      return;
  }
  _discoveryStarted = true;
  //开始搜寻附近的蓝牙外围设备
  uni.startBluetoothDevicesDiscovery({
    allowDuplicatesKey: true,
        success: (res) => {
        console.log('startBluetoothDevicesDiscovery success', res);
      //监听寻找到新设备的事件
        $onBluetoothDeviceFound(devicename)
    },
  })
}
	
function $onBluetoothDeviceFound(devicename) {
  //监听寻找到新设备的事件
  uni.onBluetoothDeviceFound(function(res){
    res.devices.forEach(device => {
      if (!device.name && !device.localName) {
        return;
      }
      console.log(device);
      //如果名字相同连接设备
      if(device.name == devicename){
        $createBLEConnection(device.deviceId);
      }
    })
  })
}
	
function $createBLEConnection(deviceId){
  //创建连接
  uni.createBLEConnection({
    deviceId:deviceId,
    success: (res) => {
      console.log(res);
      $getBLEDeviceServices(deviceId);
    },
    fail: (err) =>{
      console.log(err);
    }
  });
  $stopBluetoothDevicesDiscovery();
}
	
function $getBLEDeviceServices(deviceId) {
  //获取蓝牙设备所有服务(service)
  uni.getBLEDeviceServices({
    deviceId,
    success: (res) => {
      for (let i = 0; i < res.services.length; i++) {
        if (res.services[i].isPrimary) {
          $getBLEDeviceCharacteristics(deviceId, res.services[i].uuid);
        return;
        }
      }
    }
  });
}
	
function $getBLEDeviceCharacteristics(deviceId, serviceId){
  //获取蓝牙设备某个服务中所有特征值(characteristic)。
  uni.getBLEDeviceCharacteristics({
    deviceId,
    serviceId,
    success: (res) => {
      console.log('getBLEDeviceCharacteristics success', res.characteristics);
      for (let i = 0; i < res.characteristics.length; i++) {
          let item = res.characteristics[i]
          if (item.properties.read) {
            //读取低功耗蓝牙设备的特征值的二进制数据值。1
            uni.readBLECharacteristicValue({
              deviceId,
              serviceId,
              characteristicId: item.uuid,
            })
          }
          if (item.properties.write) {
              _deviceId = deviceId;
              _serviceId = serviceId;
              _characteristicId = item.uuid;
              $writeBLECharacteristicValue();
          }
          if (item.properties.notify || item.properties.indicate) {
          //启用低功耗蓝牙设备特征值变化时的 notify 功能，订阅特征值。
          uni.notifyBLECharacteristicValueChange({
                  deviceId,
                  serviceId,
                  characteristicId: item.uuid,
                  state: true,
              });
          }
      }
    },
    fail(res) {
        console.error('getBLEDeviceCharacteristics', res)
    }
  })
      
  //监听数据
  // 操作之前先监听，保证第一时间获取数据
  uni.onBLECharacteristicValueChange(function(characteristic){
    const idx = inArray(chs, 'uuid', characteristic.characteristicId)
    const data = {}
    if (idx === -1) {
      data[`chs[${chs.length}]`] = {
        uuid: characteristic.characteristicId,
        value: ab2hex(characteristic.value)
      }
    } else {
      data[`chs[${idx}]`] = {
        uuid: characteristic.characteristicId,
        value: ab2hex(characteristic.value)
      }
    }
    
    console.log(data);
    
    btvalue = data;
  })

}
	
	
	function $writeBLECharacteristicValue() {
		// 向蓝牙设备发送一个0x00的16进制数据
		let buffer = new ArrayBuffer(1)
		let dataView = new DataView(buffer)
		dataView.setUint8(0, 0x61 | 0);
		
		uni.writeBLECharacteristicValue({
		      deviceId: _deviceId,
		      serviceId: "0000FFE0-0000-1000-8000-00805F9B34FB",
		      characteristicId: _characteristicId,
		      value: buffer,
		      success: function(res){
		        console.log(res);
		      },
		      fail: function(res){
		        console.log(res);
		      }
		})
	};
	
	function $writeBLECharacteristicValueString(str) {
		// 向蓝牙设备发送16进制数据
		let buffer = new ArrayBuffer(str.length);
		let dataView = new DataView(buffer);
		
		for (let i in str) {
			dataView.setUint8(i, str[i].charCodeAt() | 0);
		}
		
		uni.writeBLECharacteristicValue({
		      deviceId: _deviceId,
		      serviceId: "0000FFE0-0000-1000-8000-00805F9B34FB",
		      characteristicId: _characteristicId,
		      value: buffer,
		      success: function(res){
		        console.log(res);
		      },
		      fail: function(res){
		        console.log(res);
		      }
		})
	};
	
	function $stopBluetoothDevicesDiscovery(){
		//关闭搜索
		uni.stopBluetoothDevicesDiscovery({
			success(res) {
				console.log(res);
			}
		})
	}